<?php

// $route_url = 'regex:/^\/api\/user\/(\d+)$/';
// $route_url = 'regex:/^\/api\/user\/(\d+)/$/';
// $url = '/api/user/123';
// $url = '/api/users';
// $url = '/api/users/123/asd';

// print_r(strpos($route_url, "regex:"));
// $pos = strpos($url, "regex:");
// // $pos = strpos($route_url, "regex:");
// if ($pos !== false) {
//         print_r("regex found" . "\n");
// } else {
//         print_r("regex not found" . "\n");
// }
// // 将$route_url中的"regex:"替换为""
// $route_url = str_replace("regex:", "", $route_url);
// print_r($route_url);
// 正则匹配
// print_r(strpos($url, "regex:"));

// preg_match($route_url, $url, $matches);
// print_r($matches);


// $params = ['/api/user/1', 1, "tom"];
// $pas = array_slice($params, 1);
// var_dump(...$pas);

// class UserCon
// {
//         public function getUserById($id)
//         {
//                 echo "getUserById:" . $id . "\n";
//                 var_dump($id);
//         }
// }

// $userController = new UserCon();
// $method = "getUserById";
// $params = [1];
// $userController->$method(...$params);


// 确保在执行预处理语句前已成功连接数据库
// try {
//         $pdo = new PDO(
//                 "mysql:host=localhost;dbname=php_blog_system;charset=utf8",
//                 "root",
//                 "root",
//                 [
//                         PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION  // 开启错误异常模式
//                 ]
//         );
// } catch (PDOException $e) {
//         die("数据库连接失败: " . $e->getMessage());
// }

// // 再执行预处理语句
// try {
//         $id = 1;
//         $stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
//         $stmt->execute([':id' => $id]);
// } catch (PDOException $e) {
//         die("预处理语句失败: " . $e->getMessage());
// }

// 反射用法
class Database
{
        public $conn;
}

class USerDao
{
        private $db;
        // public function __construct(Database $db)
        // {
        //         $this->db = $db;
        // }
        // 测试方法：验证是否成功注入
        public function getDbConnection()
        {
                return $this->db->conn;
        }
}

// 1. 创建Database实例（构造UserDao需要的依赖）
$dbInstance = new Database();
$dbInstance->conn = "模拟数据库连接"; // 模拟数据库连接

// 2. 反射UserDao类
$reflection = new ReflectionClass('UserDao');

// 3. 获取UserDao的构造方法
$constructor = $reflection->getConstructor();

if ($constructor) {
        // 4. 获取构造方法的参数列表
        $parameters = $constructor->getParameters();

        // 5. 解析参数依赖（这里需要Database实例）
        $dependencies = [];
        foreach ($parameters as $param) {
                // 获取参数需要的类型（这里是Database类）
                $paramType = $param->getType()->getName();

                // 检查是否已创建该类型的实例（实际项目中可能从容器中获取）
                if ($paramType === 'Database' && isset($dbInstance)) {
                        $dependencies[] = $dbInstance;
                }
        }

        // 6. 使用解析好的依赖实例化UserDao
        $userDao = $reflection->newInstanceArgs($dependencies);

        // 测试：验证是否成功注入
        var_dump($userDao->getDbConnection()); // 输出：string(16) "模拟数据库连接"
} else {
        // 如果没有构造方法，直接实例化
        $userDao = $reflection->newInstance();
        $dbProperty = $reflection->getProperty('db');
        $dbProperty->setAccessible(true);
        $dbProperty->setValue($userDao, $dbInstance);
        var_dump($userDao->getDbConnection());
}
$className = "UserDao";
// 转成首字母小写
$className = lcfirst($className);
print_r($className);
?>